package org.example.operator;

import org.example.listener.NumberEvent;
import com.google.common.eventbus.EventBus;

import java.math.BigDecimal;

/**
 * 两个数字操作的基础上，添加一些自定义功能，如 undo ，redo 操作
 * @author Silver
 * @return
 */

public abstract class ComplexNumberOperator extends NumberOperator implements Operator<BigDecimal>{

    /**
     * undo操作
     */
//    protected Undo undo;

    /**
     * redo操作
     */
//    protected Redo redo;

    /**
     * 事件处理，用来实现事件的注册，发送和监听相关事件功能，guava包中直接拿来用的。可以考虑自己实现
     */
    protected EventBus eventBus;

    /**
     * 两个数据操作后的结果保存在该属性中，类似于统一资源，undo 和 redo 操作时使用该属性记录的结果进行记录
     */
    protected ResultSource finalResult;

    /**
     * 操作实现，重写父类方法，进行 undo 和 redo 操作加强，主要用来处理两个数据操作之后，发送事件。让该事件的监听者进行自己需要的操作
     */
    @Override
    public BigDecimal operator(){
        //父类的操作
        BigDecimal result = super.operator();
        //将操作前结果和操作后接口记录下来
        ResultSource beforeResult = new ResultSource();
        beforeResult.setFinalResult(finalResult.getFinalResult());
        finalResult.setFinalResult(result);

        //发送操作数据后的事件
        eventBus.post(new NumberEvent(new OperatorField(num1, num2, beforeResult, finalResult)));
        return result;
    }



//    public void setUndo(Undo undo) {
//        this.undo = undo;
//    }
//
//    public void setRedo(Redo redo) {
//        this.redo = redo;
//    }

    public void setEventBus(EventBus eventBus) {
        this.eventBus = eventBus;
    }

    public void setFinalResult(ResultSource finalResult) {
        this.finalResult = finalResult;
    }
}
